/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package espe.ccsoft.controllers;

import espe.ccsoft.dao.PermisoDao;
import espe.ccsoft.models.Permiso;
import java.io.Serializable;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.primefaces.model.menu.DefaultMenuItem;
import org.primefaces.model.menu.DefaultMenuModel;
import org.primefaces.model.menu.DefaultSubMenu;
import org.primefaces.model.menu.MenuModel;

/**
 *
 * @author misahaelfernandez
 */
@ManagedBean
@SessionScoped
public class MenuController implements Serializable {

    private MenuModel model = new DefaultMenuModel();
    private int id_rol = 0;
    private PermisoDao permisoDao = new PermisoDao();

//    public MenuController() throws Exception {
//        // <editor-fold defaultstate="collapsed" desc="Actual">
////        DefaultMenuItem item = new DefaultMenuItem("External");
////        model = new DefaultMenuModel();
////        DefaultMenuColumn columnEstruc1 = new DefaultMenuColumn();
////        DefaultMenuColumn columnEstruc2 = new DefaultMenuColumn();
////        DefaultMenuColumn columnOpe1 = new DefaultMenuColumn();
////        DefaultMenuColumn columnMant1 = new DefaultMenuColumn();
////        DefaultMenuColumn columnReca1 = new DefaultMenuColumn();
////        DefaultMenuColumn columnDist1 = new DefaultMenuColumn();
////        DefaultMenuColumn column3 = new DefaultMenuColumn();
////        DefaultMenuColumn column4 = new DefaultMenuColumn();
////        DefaultMenuColumn column5 = new DefaultMenuColumn();
////        DefaultMenuColumn column6 = new DefaultMenuColumn();
////
////        //MENU DE ESTRUCTURA ORGANIZACIONAL        
////        DefaultSubMenu estructura = new DefaultSubMenu("Estructura Organizacional");
////        DefaultSubMenu direccion = new DefaultSubMenu("Dirección");
////        DefaultSubMenu coordinacion = new DefaultSubMenu("Coordinación");
////        DefaultSubMenu operacion = new DefaultSubMenu("Operación");
////        DefaultSubMenu documentos = new DefaultSubMenu("Documentos");
////        DefaultSubMenu reportes = new DefaultSubMenu("Reportes");                       
////        
////        item = new DefaultMenuItem("Misión, Visión y Objetivos");
////        item.setAjax(false);
////        item.setCommand("#");
////        direccion.addElement(item);
////        direccion.addElement(documentos);
////
////        item = new DefaultMenuItem("Administrativa - Financiera");
////        item.setAjax(false);
////        item.setCommand("#");
////        coordinacion.addElement(item);
////
////        item = new DefaultMenuItem("Operaciones");
////        item.setAjax(false);
////        item.setCommand("#");
////        coordinacion.addElement(item);
////
////        item = new DefaultMenuItem("Mantenimiento");
////        item.setAjax(false);
////        item.setCommand("#");
////        coordinacion.addElement(item);
////
////        item = new DefaultMenuItem("Recaudación");
////        item.setAjax(false);
////        item.setCommand("#");
////        coordinacion.addElement(item);
////
////        item = new DefaultMenuItem("Socios");
////        item.setAjax(false);
////        item.setCommand("/Socio/index");
////        operacion.addElement(item);
////
////        item = new DefaultMenuItem("Choferes");
////        item.setAjax(false);
////        item.setCommand("/Chofer/Index");
////        operacion.addElement(item);
////
////        item = new DefaultMenuItem("/Controladores");
////        item.setAjax(false);
////        item.setCommand("/Ayudante/Index");
////        operacion.addElement(item);
////
////        item = new DefaultMenuItem("Despachos");
////        item.setAjax(false);
////        item.setCommand("/Despacho/Index");
////        operacion.addElement(item);
////
////        item = new DefaultMenuItem("Unidades");
////        item.setAjax(false);
////        item.setCommand("/Unidad/Index");
////        operacion.addElement(item);
////
////        item = new DefaultMenuItem("Rutas");
////        item.setAjax(false);
////        item.setCommand("#");
////        operacion.addElement(item);
////
////        item = new DefaultMenuItem("Politicas y Lineamientos Internos");
////        item.setAjax(false);
////        item.setCommand("#");
////        documentos.addElement(item);
////
////        item = new DefaultMenuItem("Disponibilidad de Recursos Financieros");
////        item.setAjax(false);
////        item.setCommand("#");
////        documentos.addElement(item);
////
////        item = new DefaultMenuItem("Disponibilidad de Recursos Financieros");
////        item.setAjax(false);
////        item.setCommand("#");
////        documentos.addElement(item);
////
////        item = new DefaultMenuItem("Politicas de renovación de Flota");
////        item.setAjax(false);
////        item.setCommand("#");
////        documentos.addElement(item);
////
////        item = new DefaultMenuItem("Reglas de Reparto");
////        item.setAjax(false);
////        item.setCommand("#");
////        documentos.addElement(item);
////
////        item = new DefaultMenuItem("Mecanismo de recaudo y control");
////        item.setAjax(false);
////        item.setCommand("#");
////        documentos.addElement(item);
////
////        item = new DefaultMenuItem("Regimen de sanciones y bonificaciones");
////        item.setAjax(false);
////        item.setCommand("#");
////        documentos.addElement(item);
////
////        item = new DefaultMenuItem("Reglamento interno administrativo");
////        item.setAjax(false);
////        item.setCommand("#");
////        documentos.addElement(item);
////
////        item = new DefaultMenuItem("Estructura Organizacional");
////        item.setAjax(false);
////        item.setCommand("#");
////        reportes.addElement(item);
////
////        columnEstruc1.addElement(direccion);
////        columnEstruc1.addElement(coordinacion);
////        columnEstruc1.addElement(operacion);
////        columnEstruc2.addElement(documentos);
////        columnEstruc2.addElement(reportes);
////        estructura.addElement(columnEstruc1);
////        estructura.addElement(columnEstruc2);
////        model.addElement(estructura);
////
////        //MENU DE MODULO DE OPERACIONES
////        DefaultSubMenu oper = new DefaultSubMenu("Modulo de Operaciones");
////        DefaultSubMenu prog = new DefaultSubMenu("Programación");
////        DefaultSubMenu ejec = new DefaultSubMenu("Ejecución");
////        DefaultSubMenu report1 = new DefaultSubMenu("Reportes");
////
////        item = new DefaultMenuItem("Parametros Operacionales");
////        item.setAjax(false);
////        item.setCommand("Editar");
////        prog.addElement(item);
////
////        item = new DefaultMenuItem("Tablas Operacionales");
////        item.setAjax(false);
////        item.setCommand("Editar");
////        prog.addElement(item);
////
////        item = new DefaultMenuItem("Tablas de Rotación");
////        item.setAjax(false);
////        item.setCommand("Editar");
////        prog.addElement(item);
////
////        item = new DefaultMenuItem("Control Diario");
////        item.setAjax(false);
////        item.setCommand("Editar");
////        ejec.addElement(item);
////
////        item = new DefaultMenuItem("Inventario de Vehiculos");
////        item.setAjax(false);
////        item.setCommand("Editar");
////        report1.addElement(item);
////
////        item = new DefaultMenuItem("Programación Operativa");
////        item.setAjax(false);
////        item.setCommand("Editar");
////        report1.addElement(item);
////
////        item = new DefaultMenuItem("Tabla Operacional");
////        item.setAjax(false);
////        item.setCommand("Editar");
////        report1.addElement(item);
////
////        item = new DefaultMenuItem("Indicadores");
////        item.setAjax(false);
////        item.setCommand("Editar");
////        report1.addElement(item);
////
////        columnOpe1.addElement(prog);
////        columnOpe1.addElement(ejec);
////        columnOpe1.addElement(report1);
////
////        oper.addElement(columnOpe1);
////        model.addElement(oper);
////
////        //MENU DEL MODULO DE MANTENIMIENTO
////        DefaultSubMenu mant = new DefaultSubMenu("Módulo de Mantenimiento");
////        DefaultSubMenu eje1 = new DefaultSubMenu("...");        
////        columnMant1.addElement(eje1);        
////        mant.addElement(columnMant1);        
////        model.addElement(mant);
////
////        //MENU DEL MODULO DE RECAUDACION
////        DefaultSubMenu reca = new DefaultSubMenu("Módulo de Recaudación");
////        DefaultSubMenu eje2 = new DefaultSubMenu("...");                        
////        columnReca1.addElement(eje2);        
////        reca.addElement(columnReca1);        
////        model.addElement(reca);        
////        
////        //MENU DEL MODULO DE DISTRIBUCION
////        DefaultSubMenu dis = new DefaultSubMenu("Módulo de Distribución");                
////        DefaultSubMenu eje3 = new DefaultSubMenu("...");                        
////        columnDist1.addElement(eje3);        
////        dis.addElement(columnDist1);        
////        model.addElement(dis);
////        
////        //MENU DEL MODULO DE DISTRIBUCION
////        DefaultSubMenu conf = new DefaultSubMenu("Configuración");
////        model.addElement(conf);
////        
////        DefaultSubMenu ayu = new DefaultSubMenu("Ayuda");
////        model.addElement(ayu);
//        // </editor-fold>
//
//        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
//        id_rol=(Integer)session.getAttribute("Id_Rol");
//        
//        model=new DefaultMenuModel();
//        
//        PermisoDao permisoDao=new PermisoDao();
//        
//        for(Permiso padre : permisoDao.findByRolPadres(id_rol)){            
//            DefaultSubMenu menuPadre=new DefaultSubMenu();
//            menuPadre.setLabel(padre.getNombre());
//            for(Permiso hijo: permisoDao.findByRolHijos(id_rol,padre.getId())){
//                DefaultMenuItem item =new DefaultMenuItem(hijo.getNombre());
//                item.setAjax(false);
//                item.setImmediate(true);
//                item.setCommand(hijo.getComando());
//                menuPadre.addElement(item);
//            }
//
//            model.addElement(menuPadre);
//        }
//    }
    
    @PostConstruct
    public void init(){
        try {
            HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            id_rol = (Integer) session.getAttribute("Id_Rol");
            model = new DefaultMenuModel();
            permisoDao = new PermisoDao();
            
            for (Permiso padre : permisoDao.findByRolPadres(id_rol)) {
                DefaultSubMenu menuPadre = new DefaultSubMenu();
                menuPadre.setLabel(padre.getNombre());
                for (Permiso hijo : permisoDao.findByRolHijos(id_rol, padre.getId())) {
                    DefaultMenuItem item = new DefaultMenuItem(hijo.getNombre());
                    item.setAjax(false);
                    item.setImmediate(true);
                    item.setCommand(hijo.getComando());
                    menuPadre.addElement(item);
                }
                
                model.addElement(menuPadre);
            }
            model.generateUniqueIds();
        } catch (Exception ex) {
            addMessage("Error en el menu", "Error");
        }
    }
    public MenuModel getModel() throws Exception {
        return model;
    }

    public void addMessage(String summary, String detail) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, summary, detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }
}
